package core;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.Vector;

public class TasksDataBase {

    private File tasksFile;

    private Vector<GrupoTarefas> grupos;

    public Vector<GrupoTarefas> getGrupos() {
	return grupos;
    }

    public GrupoTarefas grupoPadrao;

    public TasksDataBase() {
	if (grupos == null) {
	    grupos = new Vector<GrupoTarefas>();
	    grupoPadrao = new GrupoTarefas("Geral");
	    grupos.add(grupoPadrao);
	}
    }

    public TasksDataBase(File file) {
	this.tasksFile = file;
	load();
    }

    public TasksDataBase(Usuario usuario) {
	this(usuario.getTaskFile());
    }

    public void clear() {
	grupos.clear();
	grupoPadrao.clear();
	grupos.add(grupoPadrao);
    }

    public void store() {
	try {
	    if (!tasksFile.exists()) {
		tasksFile.createNewFile();
		grupoPadrao = new GrupoTarefas("Geral");
		grupos.add(grupoPadrao);
	    }

	    FileOutputStream out = new FileOutputStream(tasksFile);
	    ObjectOutputStream novoArquivo = new ObjectOutputStream(out);
	    novoArquivo.writeObject(grupos);
	    novoArquivo.flush();
	    novoArquivo.close();
	} catch (Exception e) {
	    e.printStackTrace();
	    System.exit(1);
	}
    }

    @SuppressWarnings("unchecked")
    private void load() {
	try {

	    if (grupos == null) {
		grupos = new Vector<GrupoTarefas>();
	    }

	    FileInputStream in = null;

	    try {
		in = new FileInputStream(tasksFile);
	    } catch (FileNotFoundException e) {
		store();
		return;
	    }

	    ObjectInputStream arquivo = new ObjectInputStream(in);
	    Object read = arquivo.readObject();

	    if (read != null && read instanceof Vector<?>) {
		grupos.addAll(((Vector<GrupoTarefas>) read));
	    } else {
		throw new Exception("Arquivo de Persistencia Invalido");
	    }

	    arquivo.close();
	    in.close();
	} catch (Exception e) {
	    e.printStackTrace();
	    System.exit(1);
	}
    }
}
